当服务器出现
CPU 软锁死(
Soft Lockup),系统日志频繁报 “NMI watchdog: BUG” 时,往往是内核级问题在作祟。本文结合实战案例,带你从原理到解决方案全面拆解!
软锁死是指 CPU 核心因内核线程长时间占用(如死循环、资源竞争)无法响应调度,导致系统假死但未完全崩溃的状态。内核通过
Watchdog 机制检测:每个 CPU 的看门狗线程若超过阈值(默认 20 秒)未被调度,即触发告警并记录日志。
- 内核代码缺陷
- 自旋锁(Spinlock)使用不当导致死锁
- 驱动程序无限循环(如 i40e 网卡驱动高流量 Bug)
- 资源过载
- 单进程占用 100% CPU(如未调用 GPU 的计算任务)
- 硬件隐患
- 电源供电不稳、CPU 电压异常
- BIOS 超频或频展(Spread Spectrum)开启
- 虚拟化环境
- 虚拟机 vCPU 超过物理核心数
- 宿主机 I/O 或 CPU 压力传导
- 内核参数配置
- watchdog_thresh 阈值设置不合理(默认 20 秒)
- 中断处理异常
- 调试工具缺失
- 未启用 softlockup_panic 导致无法捕获内核 Core
- 快速定位
- 日志分析:
grep -C 5 "soft lockup" /var/log/messages
- 进程排查:
ps -ef | grep <进程名>
(如 kworker、qmgr)
- 临时缓解
- 调整超时阈值:
sysctl -w kernel.watchdog_thresh=30
(延长至 30 秒)
- 强制触发 panic:
echo 1 > /proc/sys/kernel/softlockup_panic
(需提前安装 kdump)
- 内核跟踪工具
- ftrace:挂载 debugfs 后,通过
/sys/kernel/debug/tracing
跟踪函数调用链
- perf:
perf record -g
捕获 CPU 热点函数
- 硬件健康检查
- 使用
lm-sensors
监控温度 / 电压
- 关闭 BIOS 超频和频展功能
- 内核升级
- 优先升级至稳定版内核(如 5.15+)以修复已知 Bug
- 代码优化
- 审查高负载进程逻辑(如避免无限制循环)
- 优化中断处理:分离快速路径与延迟工作
- 参数固化
- 在
/etc/sysctl.conf
添加:
kernel.watchdog_thresh=30
kernel.softlockup_panic=1
kernel.unknown_nmi_panic=1
执行sysctl -p
生效
文章链接: https://www.mfisp.com/36435.html
文章标题:CPU 软锁死:内核 Bug 排查与解决方案
文章版权:梦飞科技所发布的内容,部分为原创文章,转载请注明来源,网络转载文章如有侵权请联系我们!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。